/**
 * 
 */
package org.swing.utility.common.clazz;

import java.io.Closeable;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.swing.utility.common.imp.CloseableIterator;

/**
 * @author lqnhu
 *
 */
public class CloserUtil {
	/**
	 * Calls close() on <code>obj</code> if it implements Closeable
	 *
	 * @param obj
	 *            The potentially closeable object
	 */
	public static void close(Object obj) {
		if (obj != null) {
			close(Arrays.asList(obj));
		}
	}

	/**
	 * Calls close() on all elements of <code>objs</code> that implement
	 * Closeable
	 *
	 * @param objs
	 *            A list of potentially closeable objects
	 *
	 *            NOTE: This method must take a List<? extends Object>, not
	 *            List<Object>, otherwise the overload above will be selected if
	 *            the argument is not exactly List<Object>.
	 */
	public static void close(List<? extends Object> objs) {
		for (Object o : objs) {
			if (o instanceof Closeable) {
				try {
					((Closeable) o).close();
				} catch (IOException ioe) {
					// Do nothing
				}
			} else if (o instanceof CloseableIterator) {
				((CloseableIterator) o).close();
			} else {
				try {
					java.lang.reflect.Method m = o.getClass()
							.getMethod("close");
					m.invoke(o);
				} catch (Exception e) {
					/** Ignore */
				}
			}
		}
	}
}
